package cn.learn.utils.random;

import org.apache.commons.lang3.RandomUtils;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;

/**
 * 随机生成时间工具类
 *
 * @author huangyezhan
 * @version 1.0
 * @date 2020年10月10日1:07
 */
public class RandomDateTimeUtil {
    private RandomDateTimeUtil() {
    }

    private static final Random RANDOM = new Random();


    /**
     * @param startTimestamp 开始时间戳
     * @param endTimestamp   结束时间戳
     * @return 返回随机时间戳
     */
    private static long getRandomDateTime(long startTimestamp, long endTimestamp) {
        long min = Math.min(startTimestamp, endTimestamp);
        long max = Math.max(startTimestamp, endTimestamp);
        if (max == min) {
            return max;
        }
        return RandomUtils.nextLong(1, max - min) + min;
    }

    /**
     * 生成有限制的随机时间
     *
     * @param startDateTime 指定开始时间
     * @param endDateTime   指定结束时间
     * @param format        指定时间格式  yyyy-MM-dd HH:mm:ss
     * @return 返回生成的随机时间
     */
    public static String getRandomDateTime(Date startDateTime, Date endDateTime, String format) {
        SimpleDateFormat sdf = new SimpleDateFormat(format);
        if (startDateTime.equals(endDateTime)) {
            return sdf.format(endDateTime);
        }
        long randomDateTime = getRandomDateTime(startDateTime.getTime(), endDateTime.getTime());
        Date date           = new Date(randomDateTime);
        return sdf.format(date);
    }

    /**
     * 指定开始时间，默认结束时间为当前时间
     *
     * @param startDateTime 指定开始时间
     * @param format        指定时间格式
     * @return 返回生成的随机时间
     */
    public static String getRandomDateTime(Date startDateTime, String format) {
        return getRandomDateTime(startDateTime, new Date(System.currentTimeMillis()), format);
    }

    /**
     * 获取年月 yyyyMM
     *
     * @param startDateTime 指定开始时间
     * @param endDateTime   指定结束时间
     * @return 返回生成随机年月
     */
    public static String getYearMonth(Date startDateTime, Date endDateTime) {
        return getRandomDateTime(startDateTime, endDateTime, "yyyyMM");
    }

    /**
     * 获取年月日  yyyyMMdd
     */
    public static String getRandomDate(Date startDateTime, Date endDateTime) {
        return getRandomDateTime(startDateTime, endDateTime, "yyyyMMdd");
    }

}
